DMMF: 全域関数
LT;DR
全域関数とは、取りうる各入力に対して、それぞれ 1 つの出力が紐づいていること
例外が発生するとこれに当てはまらなくなる
Option 型を使ったり、入力を制限したりして 全域関数 になるようにする hr.icon
数学における「関数」とは、取りうる各入力に対して、それぞれ 1 つの出力が紐づいているものである(全域関数)] e.g. 12 を入力値で割った結果を返す関数
code:fsharp
let twelveDivideBy n =
match n with
| 6 -> 2
| 5 -> 2
| 4 -> 3
| 3 -> 4
| 2 -> 6
| 1 -> 12
| 0 -> ???
0 が渡ってきた場合にどうする?
例外を発生させる?
code:fsharp
let twelveDivideBy n =
match n with
| 6 -> 2
...
| 0 -> failwith "Can't divide by zero"
シグネチャ: twelveDivideBy : int -> int
シグネチャを見ると int を渡すと、必ず int が返ってくるように思える
実際は、例外が発生する可能性があるため、int が返ってくるとは限らない
全域関数 (シグネチャが明示的であるよう)にしたい 入力を制限して不正な値を排除する?
code:fsharp
type NonZeroInteger =
// ゼロではない整数になるように定義
private NonZeroInteger of int
let twelveDivideBy n =
match n with
| 6 -> 2
...
// 0 は入力になり得ないので処理する必要がない
出力を拡張する?
Option 型を用いる
code:fsharp
let twelveDivideBy n =
match n with
| 6 -> Some 2
...
| 0 -> None
シグネチャ: twelveDivideBy : int -> int option